#pragma once
#include <iostream>
#include <cassert>
using namespace std;

class Date
{
public:
	//全缺省构造函数
	Date(int year = 1900,int month = 1,int day = 1):
		_year(year),
		_month(month),
		_day(day)
	{
		/*if (!Check())
		{
			cout << "非法日期";
			exit(-1);
		}*/
		assert(Check());
	}

	//析构函数
	~Date()
	{
		_year = 0;
		_month = 0;
		_day = 0;
	}

	//拷贝构造
	Date(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}

	//赋值运算符重载
	Date& operator=(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;

		return *this;
	}

	int GetMonthDay()
	{
		static int day[13] = {-1,31,28,31,30,31,30,31,31,30,31,30,31};

		if (_month == 2 &&
			(((_year % 4 == 0) && (_year % 100 != 0)) || (_year % 400 == 0)))
		{
			return 29;
		}
		else
		{
			return day[_month];
		}
	}

	bool Check()
	{
		if (_month > 12 || _month <1 || _day >GetMonthDay() || _day < 1)
		{
			return false;
		}
		return true;
	}

	// 日期+=天数
	Date& operator+=(int day);

	// 日期+天数
	Date operator+(int day) const;

	// 日期-天数
	Date operator-(int day) const;

	// 日期-=天数
	Date& operator-=(int day);

	// 前置++
	Date& operator++();

	// 后置++
	Date operator++(int);

	// 后置--
	Date operator--(int);

	// 前置--
	Date& operator--();

	//>>运算符重载
	friend istream& operator>>(istream& input, Date& d);

	//<<运算符重载
	friend ostream& operator<<(ostream& output, const Date& d);

	// >运算符重载
	friend bool operator>(const Date& d1,const Date& d2);

	// ==运算符重载
	friend bool operator==(const Date& d1, const Date& d2);

	// >=运算符重载
	friend bool operator >= (const Date& d1, const Date& d2);

	// <运算符重载
	friend bool operator < (const Date& d1, const Date& d2);

	// <=运算符重载
	friend bool operator <= (const Date& d1, const Date& d2);

	// !=运算符重载
	friend bool operator != (const Date& d1, const Date& d2);

	// 日期-日期 返回天数
	friend int operator-(const Date& d1, const Date& d2);

private:
	int _year;
	int _month;
	int _day;
};